{
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "orig_nbformat": 4,
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3.8.10 64-bit ('test': conda)"
  },
  "interpreter": {
   "hash": "f9068beaa27b1717c309acb10300fb2603990c09df67c94bbef42553159f9e1a"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2,
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "Index(['rating', 'rank', 'cover_url', 'is_playable', 'id', 'types', 'regions',\n",
       "       'title', 'url', 'release_date', 'actor_count', 'vote_count', 'score',\n",
       "       'actors', 'is_watched', 'info_summary', 'tags', 'director',\n",
       "       'is_climbed'],\n",
       "      dtype='object')"
      ]
     },
     "metadata": {},
     "execution_count": 1
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "df = pd.read_csv('../data/douban/allMovieMergeEnd.csv')\n",
    "\n",
    "df = df[df['is_climbed']==1]\n",
    "df = df[['rating', 'rank', 'cover_url', 'is_playable', 'id',\n",
    "       'types', 'regions', 'title', 'url', 'release_date', 'actor_count',\n",
    "       'vote_count', 'score', 'actors', 'is_watched', 'info_summary', 'tags',\n",
    "       'director', 'is_climbed']]\n",
    "df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "title\n",
       "野战惊魂          0\n",
       "八爪狂鲨大战梭鱼翼龙    1\n",
       "恐怖旅馆          2\n",
       "聊斋新编之画皮新娘     3\n",
       "七月半2：前世今生     4\n",
       "dtype: int64"
      ]
     },
     "metadata": {},
     "execution_count": 2
    }
   ],
   "source": [
    "title_to_index = pd.Series(range(df.shape[0]), index=df['title']).drop_duplicates()\n",
    "movieid_to_index = pd.Series(range(df.shape[0]), index=df['id'])\n",
    "title_to_index.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                        info_summary\n",
       "0  \\n                                　　一群男男女女到树林里...\n",
       "1  \\n                                　　专注与生物科技研究与...\n",
       "2  \\n                                　　供职某媒体的杨晨（陈...\n",
       "3  \\n                                　　南唐寒阳公主死后，化...\n",
       "4  \\n                                　　本片根据网络轰动一时..."
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>info_summary</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>\\n                                　　一群男男女女到树林里...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>\\n                                　　专注与生物科技研究与...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>\\n                                　　供职某媒体的杨晨（陈...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>\\n                                　　南唐寒阳公主死后，化...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>\\n                                　　本片根据网络轰动一时...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 3
    }
   ],
   "source": [
    "df_summary = df[['info_summary']]\n",
    "df_summary.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(20426, 19)"
      ]
     },
     "metadata": {},
     "execution_count": 4
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "'\\n                                \\u3000\\u3000供职某媒体的杨晨（陈司翰 饰）和林欣雅（贡米 饰）是一对办公室情侣，不知为何二人陷入冷战，彼此横眉冷对，相顾无言。就在此时，总编（李菁 饰）命令二人前往偏远的落坡岭镇真情宾馆调查一起不久前发生的凶杀案。虽然心中不情愿，但是他们还是结伴同行。真情宾馆位于一个偏远所在，小店简陋阴暗，且正处在装修中。二人分房而睡，谁知却从对方房间传来暧昧诡异的声音。紧接着，身穿黑衣手持利刃的杀人狂惊现宾馆，展开一连串的血腥大屠杀。\\n                                    \\n                                \\u3000\\u3000令人匪夷所思的是，这一切宛如一场永远醒不过来的噩梦，折磨着这群痛苦不堪的男女……\\n                        '"
      ]
     },
     "metadata": {},
     "execution_count": 5
    }
   ],
   "source": [
    "df_summary.iloc[2]['info_summary']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba \n",
    "import re \n",
    "import string\n",
    "zh_punctuation = '＂＃＄％＆＇（）＊＋，－／：；＜＝＞＠［＼］＾＿｀｛｜｝～｟｠｢｣､\\u3000、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔·！？｡。'\n",
    "def cut_summary(s):\n",
    "    s = re.sub('[{}]'.format(zh_punctuation), '', s)\n",
    "    s = re.sub('[{}]'.format(string.punctuation), '', s)\n",
    "    s = s.replace('\\r', '')\n",
    "    s = s.replace('\\n', '')\n",
    "    s = s.replace(' ', '')\n",
    "    return ' '.join(list(jieba.cut(s)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "<ipython-input-7-c3b98e724eb0>:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_summary['info_summary'] = df_summary['info_summary'].fillna('')\n",
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\w\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 1.063 seconds.\n",
      "Prefix dict has been built successfully.\n",
      "<ipython-input-7-c3b98e724eb0>:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_summary['info_summary'] = df_summary['info_summary'].apply(cut_summary)\n"
     ]
    }
   ],
   "source": [
    "df_summary['info_summary'] = df_summary['info_summary'].fillna('')\n",
    "df_summary['info_summary'] = df_summary['info_summary'].apply(cut_summary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                        info_summary\n",
       "0        一群 男男女女 到 树林 里 去 享受 周末 顺便 互相 做爱 不料 遇上 嗜血 怪兽\n",
       "1  专注 与 生物科技 研究 与 开发 的 塞姆 公司 通过 基因 序列 重组 制造 出 了 可...\n",
       "2  供职 某 媒体 的 杨晨 陈司翰 饰 和 林欣雅 贡米 饰 是 一对 办公室 情侣 不知 为...\n",
       "3  南唐 寒阳 公主 死后 化身 骷髅 女妖 借 江南 第一 美女 西门 燕 皮囊 幻化 为 妙...\n",
       "4  本片 根据 网络 轰动一时 的 校园 灵异 社团 在 鬼节 利用 见鬼 十法 招魂 恐怖 经..."
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>info_summary</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>一群 男男女女 到 树林 里 去 享受 周末 顺便 互相 做爱 不料 遇上 嗜血 怪兽</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>专注 与 生物科技 研究 与 开发 的 塞姆 公司 通过 基因 序列 重组 制造 出 了 可...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>供职 某 媒体 的 杨晨 陈司翰 饰 和 林欣雅 贡米 饰 是 一对 办公室 情侣 不知 为...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>南唐 寒阳 公主 死后 化身 骷髅 女妖 借 江南 第一 美女 西门 燕 皮囊 幻化 为 妙...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>本片 根据 网络 轰动一时 的 校园 灵异 社团 在 鬼节 利用 见鬼 十法 招魂 恐怖 经...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 8
    }
   ],
   "source": [
    "\n",
    "df_summary.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "stop_word_list = []\n",
    "with open('../data/stopwords.txt', 'r', encoding='utf-8') as f:\n",
    "    stop_word_list = f.readlines()\n",
    "\n",
    "for s_w_i in range(len(stop_word_list)):\n",
    "    stop_word_list[s_w_i] = stop_word_list[s_w_i].strip()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "D:\\ProgramData\\Anaconda3\\envs\\test\\lib\\site-packages\\sklearn\\feature_extraction\\text.py:388: UserWarning: Your stop_words may be inconsistent with your preprocessing. Tokenizing the stop words generated tokens ['lex', '①①', '①②', '①③', '①④', '①⑤', '①⑥', '①⑦', '①⑧', '①⑨', '①ａ', '①ｂ', '①ｃ', '①ｄ', '①ｅ', '①ｆ', '①ｇ', '①ｈ', '①ｉ', '①ｏ', '②①', '②②', '②③', '②④', '②⑤', '②⑥', '②⑦', '②⑧', '②⑩', '②ａ', '②ｂ', '②ｄ', '②ｅ', '②ｆ', '②ｇ', '②ｈ', '②ｉ', '②ｊ', '③①', '③⑩', '③ａ', '③ｂ', '③ｃ', '③ｄ', '③ｅ', '③ｆ', '③ｇ', '③ｈ', '④ａ', '④ｂ', '④ｃ', '④ｄ', '④ｅ', '⑤ａ', '⑤ｂ', '⑤ｄ', '⑤ｅ', '⑤ｆ', '１２', 'ｌｉ', 'ｚｘｆｉｔｌ'] not in stop_words.\n  warnings.warn('Your stop_words may be inconsistent with '\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(20426, 147710)"
      ]
     },
     "metadata": {},
     "execution_count": 10
    }
   ],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "tfidv = TfidfVectorizer(token_pattern=r\"(?u)\\b\\w\\w+\\b\", stop_words=stop_word_list)\n",
    "# tfidv = TfidfVectorizer()\n",
    "info_summary_mt = tfidv.fit_transform(df_summary['info_summary'])\n",
    "info_summary_mt.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics.pairwise import linear_kernel\n",
    "\n",
    "summary_sim = linear_kernel(info_summary_mt, info_summary_mt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[(1, 1.0000000000000004), (8996, 0.15114299373267354), (15106, 0.10674915702349258), (1476, 0.10657922561079095), (23, 0.1026826783967042), (19501, 0.09814865656622937), (20009, 0.09694172371037516), (5581, 0.09668604551180349), (350, 0.09663837155877822), (13540, 0.09088565344945486)]\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "1        八爪狂鲨大战梭鱼翼龙\n",
       "9656        007之八爪女\n",
       "15844          公司职员\n",
       "1802           人兽杂交\n",
       "23             水落石出\n",
       "22526           咒乐园\n",
       "23053        尖叫屋大屠杀\n",
       "6101     孟山都公司眼中的世界\n",
       "352            空中轮胎\n",
       "14254     三振集团英语托业班\n",
       "13364          完美无瑕\n",
       "Name: title, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 13
    }
   ],
   "source": [
    "def recommend_by_index(movie_index, cosin_sim, recommend_num=10):\n",
    "    sim_scores = list(enumerate(cosin_sim[movie_index]))\n",
    "    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)\n",
    "    print(sim_scores[0:10])\n",
    "    recommend_res = []\n",
    "    for item in sim_scores[0:recommend_num+1]:\n",
    "        recommend_res.append(item[0])\n",
    "    return recommend_res\n",
    "res = recommend_by_index(1, cosin_sim=summary_sim, recommend_num=10)\n",
    "df['title'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "'专注 与 生物科技 研究 与 开发 的 塞姆 公司 通过 基因 序列 重组 制造 出 了 可 用于 军事 方面 的 梭鱼 翼龙 公司 老板 塞姆 原 指望 通过 该 研究 得到 大笔 资金 支持 谁知 在 第一次 实验 时 公司 内幕 有人 修改 了 梭鱼 翼龙 的 程序 导致 这 只 可怕 的 杀人 武器 失去 控制 旋即 对 视野 范围 内 的 所有 生物 展开 无差别 的 猎杀 与此同时 曾经 引发 过 无数 恐慌 与 杀戮 的 八爪 狂 鲨 被 人 狙杀 但是 它 的 卵巢 被 生物学家 洛伦 娜 所 获得 洛伦 娜 将 一只 活生生 的 章 鲨 宝宝 带到 了 某 水上 乐园 豢养 塞姆 公司 很快 发现 八爪 狂 鲨 仍然 存在 于世 他们 找到 水上 乐园 希望 狂 鲨 和 那 只 在 逃 的 生物 杀人 武器 展开 恐怖 的 对决'"
      ]
     },
     "metadata": {},
     "execution_count": 14
    }
   ],
   "source": [
    "df_summary['info_summary'][1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "Index(['rating', 'rank', 'cover_url', 'is_playable', 'id', 'types', 'regions',\n",
       "       'title', 'url', 'release_date', 'actor_count', 'vote_count', 'score',\n",
       "       'actors', 'is_watched', 'info_summary', 'tags', 'director',\n",
       "       'is_climbed'],\n",
       "      dtype='object')"
      ]
     },
     "metadata": {},
     "execution_count": 18
    }
   ],
   "source": [
    "df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_ad = df[['actors', 'director']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                              actors       director\n",
       "0                                         ['纳蒂亚·怀特']  Shawn Burkett\n",
       "1           ['罗伯特·卡拉丁', '赫克托·泽恩', '柯南·奥布莱恩', '远藤明里']  Kevin O'Neill\n",
       "2       ['陈司翰', '贡米', '来喜', '安雅', '赵铭', '李菁', '董立范']            郑来志\n",
       "3  ['丁汇宇', '殷果儿', '徐千京', '刘小奇', '叶豪', '陈嘉敏', '冯瀚'...            摩撒利\n",
       "4  ['陈美行', '翟子陌', '罗翔', '王栎昂', '赵吉', '苗青', '夏星翎',...            李红建"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>actors</th>\n      <th>director</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>['纳蒂亚·怀特']</td>\n      <td>Shawn Burkett</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>['罗伯特·卡拉丁', '赫克托·泽恩', '柯南·奥布莱恩', '远藤明里']</td>\n      <td>Kevin O'Neill</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>['陈司翰', '贡米', '来喜', '安雅', '赵铭', '李菁', '董立范']</td>\n      <td>郑来志</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>['丁汇宇', '殷果儿', '徐千京', '刘小奇', '叶豪', '陈嘉敏', '冯瀚'...</td>\n      <td>摩撒利</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>['陈美行', '翟子陌', '罗翔', '王栎昂', '赵吉', '苗青', '夏星翎',...</td>\n      <td>李红建</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 20
    }
   ],
   "source": [
    "df_ad.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "<ipython-input-21-1cdfe93c64f5>:2: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df_ad['actors'] = df_ad['actors'].apply(literal_eval)\n<ipython-input-21-1cdfe93c64f5>:3: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df_ad['director'] = df_ad['director'].fillna('')\n"
     ]
    }
   ],
   "source": [
    "from ast import literal_eval\n",
    "df_ad['actors'] = df_ad['actors'].apply(literal_eval)\n",
    "df_ad['director'] = df_ad['director'].fillna('')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                              actors       director\n",
       "0                                           [纳蒂亚·怀特]  Shawn Burkett\n",
       "1                   [罗伯特·卡拉丁, 赫克托·泽恩, 柯南·奥布莱恩, 远藤明里]  Kevin O'Neill\n",
       "2                     [陈司翰, 贡米, 来喜, 安雅, 赵铭, 李菁, 董立范]            郑来志\n",
       "3  [丁汇宇, 殷果儿, 徐千京, 刘小奇, 叶豪, 陈嘉敏, 冯瀚, 郭亚菲, 王笑天, 蔡翱...            摩撒利\n",
       "4  [陈美行, 翟子陌, 罗翔, 王栎昂, 赵吉, 苗青, 夏星翎, 常奕然, 付曼, 张力飞,...            李红建"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>actors</th>\n      <th>director</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[纳蒂亚·怀特]</td>\n      <td>Shawn Burkett</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[罗伯特·卡拉丁, 赫克托·泽恩, 柯南·奥布莱恩, 远藤明里]</td>\n      <td>Kevin O'Neill</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[陈司翰, 贡米, 来喜, 安雅, 赵铭, 李菁, 董立范]</td>\n      <td>郑来志</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[丁汇宇, 殷果儿, 徐千京, 刘小奇, 叶豪, 陈嘉敏, 冯瀚, 郭亚菲, 王笑天, 蔡翱...</td>\n      <td>摩撒利</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[陈美行, 翟子陌, 罗翔, 王栎昂, 赵吉, 苗青, 夏星翎, 常奕然, 付曼, 张力飞,...</td>\n      <td>李红建</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 22
    }
   ],
   "source": [
    "df_ad.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "<ipython-input-25-01707042ddd6>:16: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df_ad['soup_str'] = df_ad.apply(gen_soup_str, axis=1)\n"
     ]
    }
   ],
   "source": [
    "def gen_soup_str(row):\n",
    "    count = 0\n",
    "    l = row['actors']\n",
    "    d = row['director'].replace(' ', '')\n",
    "    if len(l) > 5:\n",
    "        count = 5\n",
    "    else :\n",
    "        count = len(l)\n",
    "    for i in range(count):\n",
    "        l[i] = l[i].replace('·', '')\n",
    "        l[i] = l[i].replace(' ', '')\n",
    "    res_list = l[0:count]\n",
    "    res_list.append(d)\n",
    "    s = ' '.join(res_list)\n",
    "    return s\n",
    "df_ad['soup_str'] = df_ad.apply(gen_soup_str, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                              actors       director  \\\n",
       "0                                            [纳蒂亚怀特]  Shawn Burkett   \n",
       "1                      [罗伯特卡拉丁, 赫克托泽恩, 柯南奥布莱恩, 远藤明里]  Kevin O'Neill   \n",
       "2                     [陈司翰, 贡米, 来喜, 安雅, 赵铭, 李菁, 董立范]            郑来志   \n",
       "3  [丁汇宇, 殷果儿, 徐千京, 刘小奇, 叶豪, 陈嘉敏, 冯瀚, 郭亚菲, 王笑天, 蔡翱...            摩撒利   \n",
       "4  [陈美行, 翟子陌, 罗翔, 王栎昂, 赵吉, 苗青, 夏星翎, 常奕然, 付曼, 张力飞,...            李红建   \n",
       "\n",
       "                                soup_str  \n",
       "0                     纳蒂亚怀特 ShawnBurkett  \n",
       "1  罗伯特卡拉丁 赫克托泽恩 柯南奥布莱恩 远藤明里 KevinO'Neill  \n",
       "2                    陈司翰 贡米 来喜 安雅 赵铭 郑来志  \n",
       "3                 丁汇宇 殷果儿 徐千京 刘小奇 叶豪 摩撒利  \n",
       "4                  陈美行 翟子陌 罗翔 王栎昂 赵吉 李红建  "
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>actors</th>\n      <th>director</th>\n      <th>soup_str</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[纳蒂亚怀特]</td>\n      <td>Shawn Burkett</td>\n      <td>纳蒂亚怀特 ShawnBurkett</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[罗伯特卡拉丁, 赫克托泽恩, 柯南奥布莱恩, 远藤明里]</td>\n      <td>Kevin O'Neill</td>\n      <td>罗伯特卡拉丁 赫克托泽恩 柯南奥布莱恩 远藤明里 KevinO'Neill</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[陈司翰, 贡米, 来喜, 安雅, 赵铭, 李菁, 董立范]</td>\n      <td>郑来志</td>\n      <td>陈司翰 贡米 来喜 安雅 赵铭 郑来志</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[丁汇宇, 殷果儿, 徐千京, 刘小奇, 叶豪, 陈嘉敏, 冯瀚, 郭亚菲, 王笑天, 蔡翱...</td>\n      <td>摩撒利</td>\n      <td>丁汇宇 殷果儿 徐千京 刘小奇 叶豪 摩撒利</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[陈美行, 翟子陌, 罗翔, 王栎昂, 赵吉, 苗青, 夏星翎, 常奕然, 付曼, 张力飞,...</td>\n      <td>李红建</td>\n      <td>陈美行 翟子陌 罗翔 王栎昂 赵吉 李红建</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 26
    }
   ],
   "source": [
    "df_ad.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "ad_count = CountVectorizer()\n",
    "ad_count_mt = ad_count.fit_transform(df_ad['soup_str'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(20426, 45905)"
      ]
     },
     "metadata": {},
     "execution_count": 28
    }
   ],
   "source": [
    "ad_count_mt.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "\n",
    "ad_sim = cosine_similarity(ad_count_mt, ad_count_mt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[(14466, 1.0000000000000002), (15083, 0.6666666666666669), (668, 0.5000000000000001), (4546, 0.36514837167011077), (3998, 0.3333333333333334), (4606, 0.3333333333333334), (4700, 0.3086066999241838), (2980, 0.2886751345948129), (9733, 0.2886751345948129), (18351, 0.2886751345948129)]\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "15199              唐人街探案\n",
       "15821             唐人街探案2\n",
       "683               唐人街探案3\n",
       "4961              男艺伎回忆录\n",
       "4400     青春感恩记《父亲》之《父女篇》\n",
       "5022                你在哪里\n",
       "5122     青春感恩记《父亲》之《父子篇》\n",
       "3354         11度青春之《老男孩》\n",
       "10400               大闹天竺\n",
       "21335               天气预爆\n",
       "849                   双生\n",
       "Name: title, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 30
    }
   ],
   "source": [
    "res = recommend_by_index(title_to_index['唐人街探案'], cosin_sim=ad_sim, recommend_num=10)\n",
    "df['title'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "15199        王宝强 刘昊然 佟丽娅 陈赫 肖央 陈思诚\n",
       "15821       王宝强 刘昊然 肖央 刘承羽 尚语贤 陈思诚\n",
       "683      王宝强 刘昊然 妻夫木聪 托尼贾 长泽雅美 陈思诚\n",
       "4961                     肖央 王太利 肖央\n",
       "4400                 肖央 王太利 霍思燕 肖央\n",
       "5022                  肖央 王太利 李桃 肖央\n",
       "5122              肖央 吴坚 李佳蔚 王太利 肖央\n",
       "3354          肖央 王太利 韩秋池 于蓓蓓 张菁 肖央\n",
       "10400         王宝强 白客 岳云鹏 柳岩 黄渤 王宝强\n",
       "21335          肖央 杜鹃 常远 小沈阳 岳云鹏 肖央\n",
       "849                 刘昊然 陈都灵 赵芮 金振成\n",
       "Name: soup_str, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 31
    }
   ],
   "source": [
    "df_ad['soup_str'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "<ipython-input-32-a65fd65347c7>:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_tags['tags'] = df['tags'].apply(literal_eval)\n",
      "<ipython-input-32-a65fd65347c7>:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_tags['types'] = df['types'].apply(literal_eval)\n"
     ]
    }
   ],
   "source": [
    "df_tags = df[['tags','types']]\n",
    "df_tags['tags'] = df['tags'].apply(literal_eval)\n",
    "df_tags['types'] = df['types'].apply(literal_eval)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                                tags             types\n",
       "0        [分类, 情色, 美国, 恐怖, 美国电影, 惊悚, 巨烂, 小成本烂片霸主, B级]              [恐怖]\n",
       "1  [分类, 八爪狂鲨大战梭鱼翼龙, 科幻, 美国, 电影, 恐怖, 2014, 欧美电影, 简...          [科幻, 恐怖]\n",
       "2      [分类, 脑残片, 恐怖, 中国, 中国式喜剧, 惊悚, 国产电影, 2012, 恐怖片]          [喜剧, 恐怖]\n",
       "3   [分类, 惊悚, 烂片之中的烂片啊~, 中国, 2016, 中国大陆, 恐怖, 惊悚?, 动作]          [惊悚, 恐怖]\n",
       "4  [分类, 恐怖, 惊悚, 辣眼睛, 国产, 浪费生命, 2016, 细看女主的脸，觉得很恐怖...  [剧情, 悬疑, 惊悚, 恐怖]"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>tags</th>\n      <th>types</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[分类, 情色, 美国, 恐怖, 美国电影, 惊悚, 巨烂, 小成本烂片霸主, B级]</td>\n      <td>[恐怖]</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[分类, 八爪狂鲨大战梭鱼翼龙, 科幻, 美国, 电影, 恐怖, 2014, 欧美电影, 简...</td>\n      <td>[科幻, 恐怖]</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[分类, 脑残片, 恐怖, 中国, 中国式喜剧, 惊悚, 国产电影, 2012, 恐怖片]</td>\n      <td>[喜剧, 恐怖]</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[分类, 惊悚, 烂片之中的烂片啊~, 中国, 2016, 中国大陆, 恐怖, 惊悚?, 动作]</td>\n      <td>[惊悚, 恐怖]</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[分类, 恐怖, 惊悚, 辣眼睛, 国产, 浪费生命, 2016, 细看女主的脸，觉得很恐怖...</td>\n      <td>[剧情, 悬疑, 惊悚, 恐怖]</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 33
    }
   ],
   "source": [
    "df_tags.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "<ipython-input-34-f600165ede80>:6: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df_tags['tags_str'] = df_tags.apply(gen_tag_str, axis=1)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                                                tags             types  \\\n",
       "0        [分类, 情色, 美国, 恐怖, 美国电影, 惊悚, 巨烂, 小成本烂片霸主, B级]              [恐怖]   \n",
       "1  [分类, 八爪狂鲨大战梭鱼翼龙, 科幻, 美国, 电影, 恐怖, 2014, 欧美电影, 简...          [科幻, 恐怖]   \n",
       "2      [分类, 脑残片, 恐怖, 中国, 中国式喜剧, 惊悚, 国产电影, 2012, 恐怖片]          [喜剧, 恐怖]   \n",
       "3   [分类, 惊悚, 烂片之中的烂片啊~, 中国, 2016, 中国大陆, 恐怖, 惊悚?, 动作]          [惊悚, 恐怖]   \n",
       "4  [分类, 恐怖, 惊悚, 辣眼睛, 国产, 浪费生命, 2016, 细看女主的脸，觉得很恐怖...  [剧情, 悬疑, 惊悚, 恐怖]   \n",
       "\n",
       "                                            tags_str  \n",
       "0                     美国电影 惊悚 巨烂 B级 小成本烂片霸主 美国 情色 恐怖  \n",
       "1        2014 电影 欧美电影 科幻 八爪狂鲨大战梭鱼翼龙 简直就是一毛钱特效！ 美国 恐怖  \n",
       "2                2012 喜剧 惊悚 国产电影 恐怖片 脑残片 中国 恐怖 中国式喜剧  \n",
       "3                烂片之中的烂片啊~ 惊悚 中国大陆 惊悚? 2016 动作 中国 恐怖  \n",
       "4  辣眼睛 烂片之中的烂片啊~ 细看女主的脸，觉得很恐怖 惊悚 悬疑 国产 浪费生命 2016 ...  "
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>tags</th>\n      <th>types</th>\n      <th>tags_str</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[分类, 情色, 美国, 恐怖, 美国电影, 惊悚, 巨烂, 小成本烂片霸主, B级]</td>\n      <td>[恐怖]</td>\n      <td>美国电影 惊悚 巨烂 B级 小成本烂片霸主 美国 情色 恐怖</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[分类, 八爪狂鲨大战梭鱼翼龙, 科幻, 美国, 电影, 恐怖, 2014, 欧美电影, 简...</td>\n      <td>[科幻, 恐怖]</td>\n      <td>2014 电影 欧美电影 科幻 八爪狂鲨大战梭鱼翼龙 简直就是一毛钱特效！ 美国 恐怖</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[分类, 脑残片, 恐怖, 中国, 中国式喜剧, 惊悚, 国产电影, 2012, 恐怖片]</td>\n      <td>[喜剧, 恐怖]</td>\n      <td>2012 喜剧 惊悚 国产电影 恐怖片 脑残片 中国 恐怖 中国式喜剧</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[分类, 惊悚, 烂片之中的烂片啊~, 中国, 2016, 中国大陆, 恐怖, 惊悚?, 动作]</td>\n      <td>[惊悚, 恐怖]</td>\n      <td>烂片之中的烂片啊~ 惊悚 中国大陆 惊悚? 2016 动作 中国 恐怖</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[分类, 恐怖, 惊悚, 辣眼睛, 国产, 浪费生命, 2016, 细看女主的脸，觉得很恐怖...</td>\n      <td>[剧情, 悬疑, 惊悚, 恐怖]</td>\n      <td>辣眼睛 烂片之中的烂片啊~ 细看女主的脸，觉得很恐怖 惊悚 悬疑 国产 浪费生命 2016 ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 34
    }
   ],
   "source": [
    "def gen_tag_str(row):\n",
    "    tags_list = row['tags']\n",
    "    tags_list = tags_list[1:]\n",
    "    tags_types = list(set(tags_list+row['types']))\n",
    "    return ' '.join(tags_types)\n",
    "df_tags['tags_str'] = df_tags.apply(gen_tag_str, axis=1)\n",
    "df_tags.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "tags_count = CountVectorizer()\n",
    "tags_count_mt = tags_count.fit_transform(df_tags['tags_str'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(20426, 15336)"
      ]
     },
     "metadata": {},
     "execution_count": 36
    }
   ],
   "source": [
    "tags_count_mt.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "tags_sim = cosine_similarity(tags_count_mt, tags_count_mt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[(0, 0.9999999999999999), (20307, 0.6249999999999999), (18111, 0.5892556509887895), (20087, 0.5892556509887895), (20133, 0.5892556509887895), (19110, 0.5669467095138409), (20244, 0.5669467095138409), (18339, 0.5590169943749475), (19316, 0.5590169943749475), (19702, 0.5590169943749475)]\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "0           野战惊魂\n",
       "23371       天魔异种\n",
       "21090         豹人\n",
       "23139        敲敲门\n",
       "23188         爱神\n",
       "22110       找到你了\n",
       "23305       幽冥之家\n",
       "21323       强制措施\n",
       "22331    我唾弃你的坟墓\n",
       "22739       致命弯道\n",
       "23134       嗜血狂犬\n",
       "Name: title, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 40
    }
   ],
   "source": [
    "res = recommend_by_index(title_to_index['野战惊魂'], cosin_sim=tags_sim, recommend_num=10)\n",
    "df['title'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "0                     美国电影 惊悚 巨烂 B级 小成本烂片霸主 美国 情色 恐怖\n",
       "23371                    美国电影 惊悚 科幻 B级 2015 美国 恐怖 怪物\n",
       "21090    美国电影 魔幻 NastassjaKinski 惊悚 奇幻 1982 美国 情色 恐怖\n",
       "23139                美国电影 犯罪 惊悚 基努·里维斯 2015 美国 情色 恐怖\n",
       "23188                 美国电影 惊悚 悬疑 2015 剧情 美国 情色 心理 恐怖\n",
       "22110              恐怖/惊悚 美国电影 犯罪 悬疑 惊悚 2019 剧情 美国 恐怖\n",
       "23305              美国电影 悬疑/惊悚/恐怖 惊悚 灵异 2018 鬼屋 美国 恐怖\n",
       "21323            美国电影 安娜丽·提普顿 惊悚 奇幻 2016 剧情 美国 情色 恐怖\n",
       "22331          美国电影 情色 惊悚 被唾弃的坟墓 禁片 变态 cult 美国 暴力 恐怖\n",
       "22739                  美国电影 *恐怖 惊悚 2021 翻拍 #系列 美国 恐怖\n",
       "23134                    美国电影 惊悚 恐怖片 2006 狗 美国 动物 恐怖\n",
       "Name: tags_str, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 41
    }
   ],
   "source": [
    "df_tags['tags_str'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "             rating rank                                          cover_url  \\\n",
       "8859  ['8.2', '40']  212  https://img9.doubanio.com/view/photo/s_ratio_p...   \n",
       "\n",
       "     is_playable       id               types regions  title  \\\n",
       "8859        TRUE  1292523  ['科幻', '惊悚', '冒险']  ['美国']  侏罗纪公园   \n",
       "\n",
       "                                            url release_date actor_count  \\\n",
       "8859  https://movie.douban.com/subject/1292523/    2013/8/20          22   \n",
       "\n",
       "     vote_count score                                             actors  \\\n",
       "8859     268442   8.2  ['山姆·尼尔', '劳拉·邓恩', '杰夫·高布伦', '理查德·阿滕伯勒', '鲍勃·佩...   \n",
       "\n",
       "     is_watched                                       info_summary  \\\n",
       "8859      FALSE  \\r\\n                                　　哈蒙德（理查德?...   \n",
       "\n",
       "                                                   tags   director  is_climbed  \n",
       "8859  ['分类', '科幻', '斯皮尔伯格', '美国', '恐龙', '侏罗纪公园', '经典...  史蒂文·斯皮尔伯格           1  "
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>rating</th>\n      <th>rank</th>\n      <th>cover_url</th>\n      <th>is_playable</th>\n      <th>id</th>\n      <th>types</th>\n      <th>regions</th>\n      <th>title</th>\n      <th>url</th>\n      <th>release_date</th>\n      <th>actor_count</th>\n      <th>vote_count</th>\n      <th>score</th>\n      <th>actors</th>\n      <th>is_watched</th>\n      <th>info_summary</th>\n      <th>tags</th>\n      <th>director</th>\n      <th>is_climbed</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>8859</th>\n      <td>['8.2', '40']</td>\n      <td>212</td>\n      <td>https://img9.doubanio.com/view/photo/s_ratio_p...</td>\n      <td>TRUE</td>\n      <td>1292523</td>\n      <td>['科幻', '惊悚', '冒险']</td>\n      <td>['美国']</td>\n      <td>侏罗纪公园</td>\n      <td>https://movie.douban.com/subject/1292523/</td>\n      <td>2013/8/20</td>\n      <td>22</td>\n      <td>268442</td>\n      <td>8.2</td>\n      <td>['山姆·尼尔', '劳拉·邓恩', '杰夫·高布伦', '理查德·阿滕伯勒', '鲍勃·佩...</td>\n      <td>FALSE</td>\n      <td>\\r\\n                                　　哈蒙德（理查德?...</td>\n      <td>['分类', '科幻', '斯皮尔伯格', '美国', '恐龙', '侏罗纪公园', '经典...</td>\n      <td>史蒂文·斯皮尔伯格</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 42
    }
   ],
   "source": [
    "df[df['title']=='侏罗纪公园']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "'聊斋新编之画皮新娘'"
      ]
     },
     "metadata": {},
     "execution_count": 43
    }
   ],
   "source": [
    "df['title'].loc[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "Int64Index([    0,     1,     2,     3,     4,     5,     6,     7,     8,\n",
       "                9,\n",
       "            ...\n",
       "            23485, 23486, 23487, 23488, 23489, 23490, 23491, 23492, 23493,\n",
       "            23494],\n",
       "           dtype='int64', length=20426)"
      ]
     },
     "metadata": {},
     "execution_count": 44
    }
   ],
   "source": [
    "df.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[(8202, 1.0), (7781, 0.32603059954149), (8505, 0.3228304558021829), (4875, 0.3104031624071741), (5720, 0.3020724451149982), (9691, 0.27547677020808703), (9494, 0.2490908516546356), (9030, 0.2314817625241202), (7980, 0.22586447368366053), (2883, 0.21361279870623237)]\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "8859             侏罗纪公园\n",
       "8437         你看起来好像很好吃\n",
       "9163      侏罗纪公园2：失落的世界\n",
       "5313     赛文奥特曼 地球星人的大地\n",
       "6266              恐龙末日\n",
       "10357           我的宠物恐龙\n",
       "10157             一声惊雷\n",
       "9690            侏罗纪世界2\n",
       "8637       猪猪侠大电影·恐龙日记\n",
       "3254               舍与得\n",
       "10436            史前一亿年\n",
       "Name: title, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 45
    }
   ],
   "source": [
    "res = recommend_by_index(title_to_index['侏罗纪公园'], cosin_sim=summary_sim)\n",
    "df['title'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "8859     哈蒙德 理查德 阿滕伯勒 RichardAttenborough 饰 立志 要 建立 一个 ...\n",
       "8437     哈特 山口 胜平饰 是 一只 被 草食性 恐龙 养大 的 霸王龙 其实 早 在 它 破壳 而...\n",
       "9163     当年 在 努 布拉 岛 营建 侏罗纪 公园 时 约翰 哈蒙德 理查德 阿滕伯勒 Richar...\n",
       "5313     北川 市 郊外 的 湖内 突然 出现 了 恐龙 于是 奥特 警备队 将 恐龙 冷冻 请 环境...\n",
       "6266     本片 记录 了 目前 得到 最 多 支持 的 恐龙 灭绝 假说 陨石 撞击 事件 发生 前后...\n",
       "10357    我 的 宠物 恐龙 讲述 的 是 小 男 主人公 杰克 和 他 的 朋友 查尔斯 阿贝 等 ...\n",
       "10157    不久 的 未来 当 时空旅行 不再 是 梦想 一家 旅行社 专 为 客户 安排 史前时代 狩...\n",
       "9690     自 侏罗纪 世界 的 骚乱 以来 种类 繁多 的 恐龙 在 努 布拉 岛 度过 了 三年 无...\n",
       "8637     以阿五 寻找 猪猪 侠为 开端 讲述 了 见习 超星 特工 阿五 前往 恐龙 世界 结识 了...\n",
       "3254     日式 住宅 内 房屋 的 正 中央 摆放着 一个 失物招领 箱 箱内 堆积 着 各种各样 的...\n",
       "10436    科学家 终于 发现 了 往返 古今 令 时光倒流 的 神秘 缺口 却 无法 估计 原始 恐龙...\n",
       "Name: info_summary, dtype: object"
      ]
     },
     "metadata": {},
     "execution_count": 46
    }
   ],
   "source": [
    "df_summary['info_summary'].iloc[res]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "'二十世纪 初叶 人类 历史 进入 一个 动荡不安 的 时代 曾经 辉煌 无 两 的 大英帝国 正 从 鼎盛 走向 衰落 国际局势 波谲 云 诡 战争 一触即发 在 这 重要 的 历史 时刻 一个 不合时宜 的 小 生命 出生 在 了 英国 皇室 他 就是 约翰 王子 丹尼尔 威廉姆斯 DanielWilliams 饰 乔治 五世 TomHollander 饰 与 玛丽 皇后 MirandaRichardson 饰 的 儿子 约翰 王子 聪慧 善良 相貌 圆满 却 因 患有 癫痫 而 被 认为 是 低能儿 继而 令 王室 成员 感到 羞耻 为 避免 蒙羞 皇室 将 约翰 和 保姆 拉拉 GinaMcKee 饰 送到 乡下 修养 远离 了 都市 的 喧嚣 和 宫廷 的 繁文缛节 约翰 似乎 找寻到 真正 的 自由 和 快乐 他 在 此 静静地 渡过 了 最后 的 时光 本片 根据 约翰 王子 的 真实 事迹 改编'"
      ]
     },
     "metadata": {},
     "execution_count": 47
    }
   ],
   "source": [
    "df_summary['info_summary'].loc[7714]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "'在 智利 的 阿塔卡马 沙漠 天文学家 探寻 宇宙 以 寻找 生命 的 起源 不远处 当地 的 妇女 正在 沙丘 中 搜寻 亲人 的 尸骸 他们 是 被 皮诺切特 独裁政权 随意 处置 和 杀害 的 导演 帕特里克 古 兹曼 将 这 两种 关于 生命 的 找寻 并置 在 一起 引人深思 这是 一部 在 海拔 3000 米 的 Atacama 沙漠 拍摄 的 纪录片 天文学家 聚集 在 那里 观测 群星 这个 地方 还 因 一个 原因 吸引 了 众多 来访者 地表 的 干旱 能 使 人类 尸体 完好无损 除了 那些 干尸 和 迷路 的 探险者 的 尸体 还有 许多 政治 被 关押 在 这片 沙漠 中 而 死去 影片 强调 了 这样 的 两面性 将 天文学家 观测 繁星 寻找 外星 生命 和 那些 支离破碎 的 家庭 寻找 亲人 对比 所以 影片 的 政治 层面 很 清晰 幕后 制作 导演 帕特里克 古 兹曼 的 每 一部 影片 都 和 20 世纪 智利 国家 的 回忆 有关 从 他 在 1975 年 戛纳 影展 平行 竞赛 单元 放映 的 智利 之战 三部曲 开始 一直 到 在 2004 年 非 竞赛 单元 放映 的 萨尔瓦多 阿兰 德 故乡 之光'"
      ]
     },
     "metadata": {},
     "execution_count": 48
    }
   ],
   "source": [
    "df_summary['info_summary'].loc[6307]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "14478"
      ]
     },
     "metadata": {},
     "execution_count": 49
    }
   ],
   "source": [
    "movieid_to_index['1295064']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "            0\n",
       "title        \n",
       "野战惊魂        0\n",
       "八爪狂鲨大战梭鱼翼龙  1\n",
       "恐怖旅馆        2\n",
       "聊斋新编之画皮新娘   3\n",
       "七月半2：前世今生   4"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>0</th>\n    </tr>\n    <tr>\n      <th>title</th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>野战惊魂</th>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>八爪狂鲨大战梭鱼翼龙</th>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>恐怖旅馆</th>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>聊斋新编之画皮新娘</th>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>七月半2：前世今生</th>\n      <td>4</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 50
    }
   ],
   "source": [
    "title_to_index_df = pd.DataFrame(title_to_index)\n",
    "title_to_index_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "title_to_index_df.to_csv('model/title_to_index.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "          0\n",
       "id         \n",
       "26795160  0\n",
       "25934921  1\n",
       "11511025  2\n",
       "26770773  3\n",
       "26647080  4"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>0</th>\n    </tr>\n    <tr>\n      <th>id</th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>26795160</th>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>25934921</th>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>11511025</th>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>26770773</th>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>26647080</th>\n      <td>4</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 52
    }
   ],
   "source": [
    "movieid_to_index_df = pd.DataFrame(movieid_to_index)\n",
    "movieid_to_index_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "movieid_to_index_df.to_csv('model/movieid_to_index.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "['model/tags_sim.model']"
      ]
     },
     "metadata": {},
     "execution_count": 54
    }
   ],
   "source": [
    "import joblib \n",
    "joblib.dump(value=summary_sim, filename='model/summary_sim.model')\n",
    "joblib.dump(value=ad_sim, filename='model/ad_sim.model')\n",
    "joblib.dump(value=tags_sim, filename='model/tags_sim.model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "RangeIndex(start=0, stop=13579, step=1)"
      ]
     },
     "metadata": {},
     "execution_count": 10
    }
   ],
   "source": [
    "import pandas as pd\n",
    "mvi = pd.read_csv(\"./model/movieid_to_index.csv\")\n",
    "mvi.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "mvi = pd.Series(mvi.index, index=mvi['id'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "metadata": {},
     "execution_count": 12
    }
   ],
   "source": [
    "mvi[1849031\t]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ]
}